package com.rong.juc_test.juc_base.callable;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 比较两个接口
 */
// 实现Runnable接口
class MyThread implements Runnable{

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "come in runnable");

    }
}

// 实现Callable接口
class MyThread2 implements Callable{

    @Override
    public Object call() throws Exception {
        System.out.println(Thread.currentThread().getName() + "come in callable");
        return 200;
    }

}

public class Demo1 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<Integer> futureTask1 = new FutureTask<>(new MyThread2());

        // lambda
        FutureTask<Integer> futureTask2 = new FutureTask<>(() -> {
            System.out.println(Thread.currentThread().getName() + "come in callable");
            return 1024;
        });
        new Thread(futureTask2,"lucky").start();
        new Thread(futureTask1,"marry").start();

//        while (!futureTask2.isDone()){
//            System.out.println("wait...");
//        }

        System.out.println(futureTask2.get());
//        System.out.println(futureTask2.get());// 只会计算一次 直接返回结果
        System.out.println(futureTask1.get());
        System.out.println(Thread.currentThread().getName() + "come over");
        // FutureTask原理 未来任务
        /**
         * 1. 老师上课，口渴 去买票不合适 讲课线程继续
         * 单开线程让把班长买水
         * 把水买回来，需要时直接get喝
         *
         * 2. 四个同学 1同学1+2.。+5 2同学 10+11+。。50 3同学60+61+62 4同学100+200
         *   第二同学计算量比较大 给2同学单开线程计算
         *   先汇总其他同学 等待2同学计算完成 统一汇总
         *
         * 3. 考试 先做会做的最后看不会的
         */

    }
}
